/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fs.distribuido;

import java.io.*;
import java.net.*;

public class Cliente extends Thread {

    private Socket socketCliente;
    private ObjectOutputStream saida;
    private ObjectInputStream entrada;
    private String nome = "";
    public static int qtde = 0;
    
    private long meuTimeStamp = 0;

    public Cliente(String nome) {
        this.nome = nome;
        Cliente.qtde++;
    }
    
    @Override
    public void run() {
        
        while (Cliente.qtde < 2) {
            
        }
        
        print("Todos online");
        
        try{
            //O cliente entra no grupo de multicast
            MulticastSocket mcs = new MulticastSocket(12345);
            InetAddress grupo = InetAddress.getByName("239.0.0.1");
            mcs.joinGroup(grupo);
            
            print("Conectado");
            
            //Cliente pede os recursos.
            ServidorMulticast.enviarMensagem(System.currentTimeMillis() + "");

            //Aguarda a resposta do servidor.
            byte[] buffer = new byte[256];
            DatagramPacket pkg = new DatagramPacket(buffer, buffer.length);
            mcs.receive(pkg);
            
            long timestamp = Long.parseLong(new String(pkg.getData()).trim());
            if(timestamp < meuTimeStamp){
                print("Outro cliente pediu primeiro");
            }
        } catch (Exception ex) {
            System.out.println("Erro: " + ex);
        }
        
        //Aguarda mensagens multicast do servidor
//        new Escutar().start();
        
        //Diz que quer usar os recursos.
//        this.meuTimeStamp = System.currentTimeMillis();
//        System.out.println(this.nome + "> " + this.meuTimeStamp);
//        ServidorMulticast.enviarMensagem(this.meuTimeStamp + "");
//                
//        System.out.println(this.nome + " posso usar!");
        
//        try {
//            //Cria o socket para se comunicar com o servidor.
//            socketCliente = new Socket("localhost", 2004);
//            System.out.println(this.nome + "> conectado ao servidor (porta 2004).");
//
//            //Obtém os fluxos de entrada e saída.
//            saida = new ObjectOutputStream(socketCliente.getOutputStream());
//            saida.flush();
//            entrada = new ObjectInputStream(socketCliente.getInputStream());
//            
//            enviarMensagem("oi");
//            
//            boolean encerrar = false;
//            
//            while (!encerrar) {
//                //Aguarda até que o servidor envie alguma resposta.
//                entrada.read();
//                Object obj = entrada.readObject();
//                if (obj instanceof String) {
//                    //Imprime a resposta do servidor
//                    System.out.println(obj);
//                    if(!obj.toString().equals("bye")){
//                        Scanner sc = new Scanner(System.in);
//                        String comando = sc.nextLine();
//                        enviarMensagem(comando);
//                    } else{
//                        System.out.println("Desconectando...");
//                        break;
//                    }
//                    
//                }
//            }
//
//        } catch (IOException | ClassNotFoundException ex) {
//            System.err.println("Erro: " + ex);
//        } finally {
//            //Fecha todas as conexões.
//            try {
//                entrada.close();
//                saida.close();
//                socketCliente.close();
//                System.out.println(this.nome + "> conexão encerrada.");
//            } catch (IOException ex) {
//                System.err.println("Erro: " + ex);
//            }
//        }
    }
    
    private void print(String msg){
        System.out.println(this.nome + "> " + msg);
    }

    /**
     * Envia uma mensagem para o servidor.
     *
     * @param msg Objeto a ser enviado.
     */
    void enviarMensagem(Object msg) {
        try {
            saida.writeObject(msg);
            saida.flush();
        } catch (IOException ex) {
            System.err.println("Erro ao enviar mensagem: " + ex);
        }
    }

    public static void main(String args[]) {
        Cliente c1 = new Cliente("Cliente 1");
        c1.start();
        Cliente c2 = new Cliente("Cliente 2");
        c2.start();
    }
}